// 数组实现
// function isValid(str) {
//     // 字符串不是成对出现，就肯定不合法
//     if (str.length % 2 !== 0) {
//         return false;
//     }
//     const stack = [];
//     for (let s of str) {
//         if (s === '(' || s === '[' || s === '{') {
//             // 入栈
//             stack.push(s);
//         } else {
//             // 出栈
//             stack.pop();
//         }
//     }
//     return stack.length === 0;
// }


// 集合实现
// function isValid(str) {
//     // 字符串不是成对出现，就肯定不合法
//     if (str.length % 2 !== 0) {
//         return false;
//     }
//     const stack = new Set();
//     for (let s of str) {
//         if (s === '(' || s === '[' || s === '{') {
//             // 入栈
//             stack.add(s);
//         }
//         if (s === ')') {
//             // 出栈
//             stack.delete('(');
//         }
//         if (s === ']') {
//             // 出栈
//             stack.delete('[');
//         }
//         if (s === '}') {
//             // 出栈
//             stack.delete('{');
//         }
//     }
//     return stack.size === 0;
// }


// 数值实现
function isValid(str) {
    if (str.length % 2 !== 0) {
        return false;
    }
    let i = 0;
    for (let s of str) {
        if (s === '(' || s === '[' || s === '{') {
            i++;
        } else {
            i--;
        }
    }
    return i === 0;
}

const strArr = '([{}]))';
console.log(isValid(strArr) ? '合法' : '不合法');
